package com.zb.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.pdf.BaseFont;
import com.zb.util.CommonUtils;
import com.zb.util.FreemarkerUtils;
import com.zb.vo.LocationVo;
import com.zb.vo.OrderInfo;

/**
 * pdf文件打印
 *
 */
@Controller
@RequestMapping("/printpdf")
public class PrintPdfController {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 全局的测试数据集合
     */
    private static List<OrderInfo> orderInfos = new ArrayList<OrderInfo>();
    private static List<LocationVo> sendLocationVos = new ArrayList<LocationVo>();
    private static List<LocationVo> receiverLocationVos = new ArrayList<LocationVo>();
    private static List<String> customerNames = new ArrayList<>();
    
    /**
     * 初始化测试数据
     */
    static{
        initData();
    }
    
    
    
    
    /**
     * 打印PDF
     * 
     * 创建日期：2016年7月22日 下午1:04:26
     * 操作用户：zhoubang
     * 
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping(value = "/freemarker")
    public void send(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.debug("pdf文件打印");
        
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
        Map<String, Object> root = new HashMap<>();
        root.put("base", basePath);
        root.put("orderInfos", orderInfos);
        root.put("sendlvs", sendLocationVos);
        root.put("receiverlvs", receiverLocationVos);
        root.put("customerNames", customerNames);
        
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename=print.pdf");//print.pdf 是生成的文件名称
        
        try {
            String frontPath = new ClassPathResource("../printTemplete/msyh.ttf").getFile().getAbsolutePath();
            String templateString = FileUtils.readFileToString(new ClassPathResource("../printTemplete/ems.ftl").getFile());//加载读取模板内容
            
            //调用具体打印pdf方法
            printPdf(root, templateString, frontPath, response.getOutputStream());
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    /**
     * 打印PDF具体代码
     * 
     * 创建日期：2016年7月22日 下午1:07:38
     * 操作用户：zhoubang
     * 
     * @param root
     * @param templateString
     * @param frontPath
     * @param outputStream
     */
    private void printPdf(Map<String, Object> root, String templateString, String frontPath, ServletOutputStream outputStream) {
        String ttt = null;
        try {
            ttt = FreemarkerUtils.process(templateString, root);
            ITextRenderer iTextRenderer = new ITextRenderer();
            iTextRenderer.setDocumentFromString(ttt);
            if (CommonUtils.isNotEmpty(frontPath)) {
                ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
                fontResolver.addFont(frontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            iTextRenderer.layout();
            iTextRenderer.createPDF(outputStream);
        } catch (Exception e) {
            logger.info("打印ems模板单出错" + e.getMessage());
        }
        if (ttt == null) {
            logger.info("打印ems模板单出错,生成模板为空");
            return;
        }
    }
    
    
    
    
    
    /**
     * 初始化一些测试数据。
     *      注意：如果想在一个PDF文件中，生成多个单子，则，可以手动为每一个List集合中加入相应的对象。
     *          你也可以将下面的注释去掉，就会生成2个单子的PDF。更多的单子，以此类推。实际开发的时候，肯定是读取数据库，进行遍历。
     * 
     * 创建日期：2016年7月22日 下午1:02:27
     * 操作用户：zhoubang
     *
     */
    public static void initData(){
        //模拟数据
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setTrackNo("8648722123456");
        orderInfo.setSendName("张三");
        orderInfo.setSendAddress("上海市普陀区武宁路");
        orderInfo.setReceiverName("李四");
        orderInfo.setReceiverTel("15988888888");
        orderInfo.setReceiverAddress("江苏省徐州市睢宁县");
        orderInfo.setWeight(2000);
        orderInfo.setOrderNo("20160722123456");
        orderInfo.setProductName("衣物");
        orderInfo.setProNameRemark("备注什么好呢");
        orderInfos.add(orderInfo);
        
        /*OrderInfo orderInfo2 = new OrderInfo();
        orderInfo2.setTrackNo("99999999999999");
        orderInfo2.setSendName("王武");
        orderInfo2.setSendAddress("上海市徐汇区田林路");
        orderInfo2.setReceiverName("孙倩");
        orderInfo2.setReceiverTel("15978978978");
        orderInfo2.setReceiverAddress("江苏省南京市");
        orderInfo2.setWeight(5000);
        orderInfo2.setOrderNo("20160722987889");
        orderInfo2.setProductName("动物");
        orderInfo2.setProNameRemark("备注什么好呢");
        orderInfos.add(orderInfo2);*/
        
        
        LocationVo vo = new LocationVo();
        vo.setProvinceName("上海市");
        vo.setCityName("上海市");
        vo.setAreaName("徐汇区");
        sendLocationVos.add(vo);
        
        /*LocationVo voo = new LocationVo();
        voo.setProvinceName("北京市");
        voo.setCityName("北京市");
        voo.setAreaName("朝阳区");
        sendLocationVos.add(voo);*/
        
        
        LocationVo vo2 = new LocationVo();
        vo2.setProvinceName("江苏省");
        vo2.setCityName("徐州市");
        vo2.setCityName("睢宁县");
        receiverLocationVos.add(vo2);
        
        /*LocationVo vo22 = new LocationVo();
        vo22.setProvinceName("江苏省");
        vo22.setCityName("泰州市");
        vo22.setCityName("未知县");
        receiverLocationVos.add(vo22);*/
        
        customerNames.add("上海麦当劳有限公司");
        //customerNames.add("上海肯德基有限公司");
    }
}
